package com.aoxun.android.landlord.common;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;

/**
 * Created by admin on 2017/7/24.
 */

public class SharedPreferencesUtils {
     private final static String SP_FILE = "default_sp";


    /**
     * 保存数据的方法，我们需要拿到保存数据的具体类型，然后根据类型调用不同的保存方法
     * @param context
     * @param key
     * @param object
     */
    public static void setParam(Context context , String key, Object object){

        String type = object.getClass().getSimpleName();
        SharedPreferences sp = context.getSharedPreferences(SP_FILE, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        if("String".equals(type)){
            editor.putString(key, (String)object);
        }
        else if("Integer".equals(type)){
            editor.putInt(key, (Integer)object);
        }
        else if("Boolean".equals(type)){
            editor.putBoolean(key, (Boolean)object);
        }
        else if("Float".equals(type)){
            editor.putFloat(key, (Float)object);
        }
        else if("Long".equals(type)){
            editor.putLong(key, (Long)object);
        }

        editor.commit();
    }


    /**
     * 得到保存数据的方法，我们根据默认值得到保存的数据的具体类型，然后调用相对于的方法获取值
     * @param context
     * @param key
     * @param defaultObject
     * @return
     */
    public static Object getParam(Context context , String key, Object defaultObject){
        String type = defaultObject.getClass().getSimpleName();
        SharedPreferences sp = context.getSharedPreferences(SP_FILE, Context.MODE_PRIVATE);

        if("String".equals(type)){
            return sp.getString(key, (String)defaultObject);
        }
        else if("Integer".equals(type)){
            return sp.getInt(key, (Integer)defaultObject);
        }
        else if("Boolean".equals(type)){
            return sp.getBoolean(key, (Boolean)defaultObject);
        }
        else if("Float".equals(type)){
            return sp.getFloat(key, (Float)defaultObject);
        }
        else if("Long".equals(type)){
            return sp.getLong(key, (Long)defaultObject);
        }

        return null;
    }


    /**
     * 使用SharedPreferences保存对象类型的数据
     * 先将对象类型转化为二进制数据，然后用特定的字符集编码成字符串进行保存
     * @param context				上下文对象
     * @param spName				SharedPreferences文件名
     * @param key					SharedPreferences文件中对应的key
     * @param object				需要保存的对象
     */
    public static void saveObject(Context context, String spName, String key, Object object){
        SharedPreferences sharedPreferences = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(baos);
            oos.writeObject(object);
            String objStr = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
            editor.putString(key, objStr);
            editor.commit();
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                if(null != oos){
                    oos.close();
                }
                if(null != baos){
                    baos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 根据文件名取得存储的数据对象
     * 先将取得的数据转化成二进制数组，然后转化成对象
     * @param context					上下文对象
     * @param spName					SharedPreferences文件名
     * @param key						SharedPreferences文件中对应的key
     * @return							保存在SharedPreferences中的对象
     */
    public static Object readObject(Context context, String spName, String key){
        SharedPreferences sharedPreferences =  context.getSharedPreferences(spName, Context.MODE_PRIVATE);
        String message  = sharedPreferences.getString(key, "");
        Object obj = null;
        if(null != message && !"".equals(message)){
            byte[] buffer = Base64.decode(message.getBytes(), Base64.DEFAULT);
            ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
            ObjectInputStream ois = null;
            try {
                ois = new ObjectInputStream(bais);
                obj = ois.readObject();
            } catch (StreamCorruptedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }finally{
                try {
                    if(null != ois){
                        ois.close();
                    }
                    if(null != bais){
                        bais.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return obj;
    }
}
